import { isType } from './m.common';

/**
 * 是否是一个空数组
 * @param { Array<unknown> } value 需要判断的数据
 * @returns { boolean } 是否为空数组
 * **/
export const isEmptyArray = (value: Array<unknown>): boolean => {
    if (!isType(value, 'array'))
        throw new Error('invalid isEmptyArray parameter');
    else return !value.length;
};

/**
 * 判断一个数据或一组数据均为指定的类型
 * @param { string } type 类型名称  array、object 等使用原型链判断的类型末尾小写
 * @param { Array } args 需要判断的数据
 * @returns { boolean } 一个数据或一组数据是否均为指定的类型
 * **/
export const validType = (
    type: string,
    ...args: Array<Array<unknown>>
): boolean => {
    return !args.find((item) => !isType(item, type));
};

/**
 * 交集方法
 * @param { Array<Array<unknown>> } args 数据列表
 * @returns { Array<unknown> } 交集数组
 * **/
export const intersectionArrayList = (...args: Array<Array<unknown>>) => {
    return args.reduce((acc, array) => {
        return acc.filter((item) => array.includes(item));
    });
};

/**
 * 差集方法
 * @param { Array<unknown> } baseArray  求差集的基准列表
 * @param { Array<unknown> } args 差集列表
 * @returns { Array<unknown> } 差集
 * **/
export const differenceArrayList = (
    baseArray: Array<unknown>,
    ...args: Array<Array<unknown>>
) => {
    const otherElementsSet = new Set(...args);
    return baseArray.filter((item) => !otherElementsSet.has(item));
};

/**
 * 并集方法
 * @param { Array<Array<unknown>> } args  求并集的数组
 * @returns { Array<unknown> } 并集数组
 * **/
export const unionArrayList = (...args: Array<Array<unknown>>) => {
    return [...new Set(args.flat(1))];
};
